/* eslint camelcase: 0 */
'use strict';
var sockjs = require('sockjs');
var debug = require('debug')('sockjs-client:test-server:app');

exports.install = function(opts, server) {
	var sjs_echo = sockjs.createServer(opts);
	sjs_echo.on('connection', function(conn) {
		debug('    [+] echo open    ' + conn);
		conn.on('close', function() {
			debug('    [-] echo close   ' + conn);
		});
		conn.on('data', function(m) {
			var d = JSON.stringify(m);
			debug('    [ ] echo message ' + conn, d.slice(0, 64) + ((d.length > 64) ? '...' : ''));
			conn.write(m);
		});
	});

	var sjs_close = sockjs.createServer(opts);
	sjs_close.on('connection', function(conn) {
		debug('    [+] close open    ' + conn);
		conn.close(3000, 'Go away!');
		conn.on('close', function() {
			debug('    [-] close close   ' + conn);
		});
	});

	var sjs_ticker = sockjs.createServer(opts);
	sjs_ticker.on('connection', function(conn) {
		debug('    [+] ticker open   ' + conn);
		var tref;
		var schedule = function() {
			conn.write('tick!');
			tref = setTimeout(schedule, 1000);
		};
		tref = setTimeout(schedule, 1000);
		conn.on('close', function() {
			clearTimeout(tref);
			debug('    [-] ticker close   ' + conn);
		});
	});

	var broadcast = {};
	var sjs_broadcast = sockjs.createServer(opts);
	sjs_broadcast.on('connection', function(conn) {
		debug('    [+] broadcast open ' + conn);
		broadcast[conn.id] = conn;
		conn.on('close', function() {
			delete broadcast[conn.id];
			debug('    [-] broadcast close' + conn);
		});
		conn.on('data', function(m) {
			debug('    [-] broadcast message', m);
			for ( var id in broadcast) {
				broadcast[id].write(m);
			}
		});
	});

	var sjs_amplify = sockjs.createServer(opts);
	sjs_amplify.on('connection', function(conn) {
		debug('    [+] amp open    ' + conn);
		conn.on('close', function() {
			debug('    [-] amp close   ' + conn);
		});
		conn.on('data', function(m) {
			var n = Math.floor(Number(m));
			n = (n > 0 && n < 19) ? n : 1;
			debug('    [ ] amp message: 2^' + n);
			conn.write(new Array(Math.pow(2, n) + 1).join('x'));
		});
	});

	sjs_echo.installHandlers(server, {
		prefix : '/echo',
		response_limit : 4096
	});
	sjs_echo.installHandlers(server, {
		prefix : '/disabled_websocket_echo',
		websocket : false
	});
	sjs_echo.installHandlers(server, {
		prefix : '/cookie_needed_echo',
		jsessionid : true
	});
	sjs_close.installHandlers(server, {
		prefix : '/close'
	});
	sjs_ticker.installHandlers(server, {
		prefix : '/ticker'
	});
	sjs_amplify.installHandlers(server, {
		prefix : '/amplify'
	});
	sjs_broadcast.installHandlers(server, {
		prefix : '/broadcast'
	});
};
